package cn.sat.miniodemo.test;

import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.SetBucketLifecycleArgs;
import io.minio.messages.*;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;

import java.util.List;

@Slf4j
public class MinioMultipartUploadExample {

    // private static final Logger log = LoggerFactory.getLogger(MinioMultipartUploadExample.class);

    // public static void main(String[] args) {
    //     // MinIO 服务配置
    //     String endpoint = "http://127.0.0.1:9090";
    //     String accessKey = "root";
    //     String secretKey = "123456789";
    //     String bucketName = "root";
    //     String objectName = "uploads/large-file.zip"; // 上传到 MinIO 的目标路径
    //     String filePath = "D:\\test.zip"; // 本地待上传的大文件
    //
    //     // 创建 MinIO 客户端
    //     MinioClient minioClient = MinioClient.builder()
    //             .endpoint(endpoint)
    //             .credentials(accessKey, secretKey)
    //             .build();
    //
    //     try {
    //         // 检查 bucket 是否存在，不存在则创建（可选）
    //         // 2. 创建桶（如果不存在）
    //         boolean exists = minioClient.bucketExists(
    //                 BucketExistsArgs.builder().bucket(bucketName).build());
    //         if (!exists) {
    //             minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
    //             log.info("✅ 桶已创建：{}", bucketName);
    //             // 3. 配置生命周期规则：30 天后自动删除对象
    //             LifecycleRule rule = new LifecycleRule(
    //                     Status.ENABLED,                                   // 规则状态
    //                     null,                                             // 中断未完成上传
    //                     new Expiration((ResponseDate) null, 30, null),    // 30 天后过期
    //                     new RuleFilter(""),                               // 匹配所有对象
    //                     null,                                             // 规则ID（自动生成）
    //                     null,                                             // 非当前版本过期
    //                     null,                                             // 非当前版本转换
    //                     null                                              // 转换规则
    //             );
    //
    //             LifecycleConfiguration config = new LifecycleConfiguration(List.of(rule));
    //
    //             minioClient.setBucketLifecycle(
    //                     SetBucketLifecycleArgs.builder()
    //                             .bucket(bucketName)
    //                             .config(config)
    //                             .build());
    //
    //             System.out.println("✅ 生命周期规则已配置：30 天后自动删除");
    //         }
    //
    //         // 使用 SDK 提供的简单方法实现分片上传（内部自动处理分片逻辑）
    //         // 注意：这个方法适用于大文件，MinIO SDK 内部会自动进行分片上传
    //         minioClient.uploadObject(
    //                 UploadObjectArgs.builder()
    //                         .bucket(bucketName)
    //                         .object(objectName)
    //                         .filename(filePath)
    //                         .build()
    //         );
    //
    //         System.out.println("文件分片上传成功: " + objectName);
    //
    //         // } catch (MinioException e) {
    //         //     log.info("Error occurred: " + e);
    //         // } catch (InvalidKeyException | NoSuchAlgorithmException e) {
    //         //     log.info("Error occurred: " + e);
    //     } catch (Exception e) {
    //         log.info("Error occurred: {}", e.getMessage());
    //     }
    // }

    public static void main(String[] args) throws Exception {
        // 1. 创建客户端
        MinioClient client = MinioClient.builder()
                .endpoint("http://localhost:9090")
                .credentials("root", "123456789")
                .build();

        String bucketName = "my-bucket";

        // 2. 创建桶（如果不存在）
        boolean exists = client.bucketExists(
                BucketExistsArgs.builder().bucket(bucketName).build());
        if (!exists) {
            client.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            System.out.println("✅ 桶已创建：" + bucketName);
        }

        // 3. 配置生命周期规则：30 天后自动删除对象
        LifecycleConfiguration config = getLifecycleConfiguration(1);

        client.setBucketLifecycle(
                SetBucketLifecycleArgs.builder()
                        .bucket(bucketName)
                        .config(config)
                        .build());

        System.out.println("✅ 生命周期规则已配置：30 天后自动删除");
    }

    /**
     * 生命周期规则
     * @param days 过期天数
     * @return 生命周期规则
     */
    private static @NotNull LifecycleConfiguration getLifecycleConfiguration(Integer days) {
        LifecycleRule rule = new LifecycleRule(
                Status.ENABLED,                                   // 规则状态
                null,                                             // 中断未完成上传
                new Expiration((ResponseDate) null, days, null),    // 7 天后过期
                new RuleFilter(""),                               // 匹配所有对象
                null,                                             // 规则ID（自动生成）
                null,                                             // 非当前版本过期
                null,                                             // 非当前版本转换
                null                                              // 转换规则
        );

        return new LifecycleConfiguration(List.of(rule));
    }
}
